import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { missing } from '../../../utils/utils';

@Injectable()
export class SubjectService {

  /** 表单按钮事件 **/
  public event_form_button = 'event:form.button';

  /** 表单刷新事件 **/
  public event_form_refresh = 'event:form.refresh';

  /** 表单数据加载事件 **/
  public event_form_load = 'event:form.load';

  /** 表单初始化事件 **/
  public event_form_init = 'event:form.init';

  /** 表单步骤条事件 **/
  public event_form_steps = 'event:form.steps';

  /** 编辑状态填充grid 使用过程中带上表格对应的key  event:grid.fill.key**/
  public event_grid_fill = 'event:grid.fill';

  /** 用于动态过滤表格显示  event:grid.fill.key**/
  public event_grid_filter = 'event:grid.filter';

  /** 编辑状态填充grid 使用过程中带上表格对应的key  event:grid.fill.key**/
  public event_grid_rest_columns = 'event:grid.rest.columns';

  /** event_grid_update 更新表格数据事件 **/
  public event_grid_update = 'event:grid.update';

  /** event_grid_update 更新表格数据事件 **/
  public event_grid_cell_stop_editor = 'event:grid.cell.stop.editor';

  /** event_from_grid_update 表格行更新事件 **/
  public event_from_grid_update = 'event:from.grid.update';

  /** event_from_grid_update 表格行最后更新事件 **/
  public event_from_grid_stop_update = 'event:from.grid.stop.update';

  /**grid 级联**/

  public event_grid_cascade = 'event:grid.cascade';

  /** 流程执行后的刷新事件 **/
  public event_wf_refresh = 'event:wf.refresh';

  /** 表单查找回调函数**/
  public callback_form_search = 'callback:form.search';

  /** 按钮不可用事件 **/
  public event_form_button_disable = 'event:form.button.disable';

  /** 页面按钮事件 **/
  public event_button = 'event:button';

  /** 页面按钮回调事件 **/
  public event_button_callback = 'event:button.callback';

  /**
   * 功能：向指定的主题订阅消息
   * @param ctx 上下方环境变量
   * @param {string} topic 订阅主题
   * @param data 消息
   */
  subscribe(ctx: any, topic: string, ...handlers: Function[]): void {
    this.getSubject(ctx, topic).subscribe(data => {
      handlers.forEach((handler) => {
        handler(data);
      });
    });
  }

  /**
   * 功能：向指定的主题发送消息
   * @param ctx 上下方环境变量
   * @param {string} topic 订阅主题
   * @param data 消息
   */
  publish(ctx: any, topic: string, data: any): void {
    this.getSubject(ctx, topic).next(data);
  }

  /**
   * 功能：获取指定的主题
   * @param ctx 上下方环境变量
   * @param {string} topic 订阅主题
   * @returns {Subject<any>}
   */
  getSubject(ctx: any, topic: string): Subject<any> {
    let subject = ctx.subjects[topic];
    if (missing(subject)) {
      subject = new Subject();
      ctx.subjects[topic] = subject;
    }
    return subject;
  }


}
